home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 9 / FM Towns Free Software Collection 9.iso / t_os / tool / tetujin / src / g_eff / midflt.c < prev    next >
Text File  |  1994-11-16  |  3KB  |  170 lines

  1. /*
  2.         graphic effect lib.
  3.  
  4.         h. Toda 1994 8 22
  5. */
  6.  
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <egb.h>
  10. #include "g_eff.h"
  11.  
  12. #define NOERR 0        /* no error */
  13.  
  14. static int mx ;
  15. static int aSen ;
  16. static int mSen ;
  17. static int cMax ;
  18. static int aMax ;
  19. static int x1 ;
  20. static int y1 ;
  21. static int x2 ;
  22. static int y2 ;
  23. static int (*read1)() ;
  24. static int (*read2)() ;
  25. static int (*write)() ;
  26. static int (*mask)() ;
  27.  
  28. g_s_c_Filter( BASICPARA *para, int rate )
  29. {
  30.     unsigned char a[3][4] ;
  31.     int add[256] ;
  32.     int i, x, y ;
  33.     int n ;
  34.  
  35.     mx = para->mix ;
  36.     aSen = para->alphaSen ;
  37.     mSen = para->maskSen ;
  38.     cMax = para->colorMax ;
  39.     aMax = para->alphaMax ;
  40.     x1 = para->lupx ;
  41.     y1 = para->lupy ;
  42.     x2 = para->rdwx ;
  43.     y2 = para->rdwy ;
  44.     read1 = para->read1 ;
  45.     read2 = para->read2 ;
  46.     write = para->write ;
  47.     mask = para->mask ;
  48.  
  49.     for( i=0 ; i<256 ; i++ )
  50.     {
  51.         if( i < rate )
  52.             add[i] = 0 ;
  53.         else if( i < rate*3 )
  54.             add[i] = (i-rate)*(i-rate)*(-2*i + 9*rate)/(4*rate*rate) ;
  55.         else if( i < 256 )
  56.             add[i] = i ;
  57.     }
  58.  
  59.     for( y = y1 ; y <= y2 ; y++ )
  60.     {
  61.         for( x=x1 ; x <= x2 ; x++ )
  62.         {
  63.             read1( x, y, a[0] ) ;
  64.             read2( x, y, a[1] ) ;
  65.  
  66.             for( i=0 ; i<3 ; i++ )
  67.             {
  68.                 int del ;
  69.  
  70.                 del = a[0][i] - a[1][i] ;
  71.  
  72.                 if( del >= 0 )
  73.                     a[2][i] = a[1][i] + add[ del ] ;
  74.                 else
  75.                     a[2][i] = a[1][i] - add[ -del ] ;
  76.             }
  77.             mixWrite( x, y, a[2], a[0] ) ;
  78.         }
  79.     }
  80.  
  81.     return NOERR ;
  82. }
  83.  
  84. g_c_m_Filter( BASICPARA *para, int rate )
  85. {
  86.     unsigned char a[3][4] ;
  87.     int add[256] ;
  88.     int i, x, y ;
  89.     int n ;
  90.  
  91.     mx = para->mix ;
  92.     aSen = para->alphaSen ;
  93.     mSen = para->maskSen ;
  94.     cMax = para->colorMax ;
  95.     aMax = para->alphaMax ;
  96.     x1 = para->lupx ;
  97.     y1 = para->lupy ;
  98.     x2 = para->rdwx ;
  99.     y2 = para->rdwy ;
  100.     read1 = para->read1 ;
  101.     read2 = para->read2 ;
  102.     write = para->write ;
  103.     mask = para->mask ;
  104.  
  105.     for( i=0 ; i<256 ; i++ )
  106.     {
  107.         if( i < rate )
  108.             add[i] = 0 ;
  109.         else if( i < rate*3 )
  110.             add[i] = (i-rate)*(i-rate)*(-2*i + 9*rate)/(4*rate*rate) ;
  111.         else if( i < 256 )
  112.             add[i] = i ;
  113.     }
  114.  
  115.     for( y = y1 ; y <= y2 ; y++ )
  116.     {
  117.         for( x=x1 ; x <= x2 ; x++ )
  118.         {
  119.             read2( x, y, a[0] ) ;
  120.             read1( x, y, a[1] ) ;
  121.  
  122.             for( i=0 ; i<3 ; i++ )
  123.             {
  124.                 int del ;
  125.  
  126.                 del = a[0][i] - a[1][i] ;
  127.  
  128.                 if( del >= 0 )
  129.                     a[2][i] = a[1][i] + add[ del ] ;
  130.                 else
  131.                     a[2][i] = a[1][i] - add[ -del ] ;
  132.             }
  133.             mixWrite( x, y, a[2], a[1] ) ;
  134.         }
  135.     }
  136.  
  137.     return NOERR ;
  138. }
  139.  
  140. static mixWrite( int x, int y, unsigned char *a, unsigned char *b )
  141. {
  142.     unsigned char c[4] ;
  143.     int mix ;
  144.  
  145.     if( mSen )
  146.     {
  147.         if( mask( x, y ) >= mSen )
  148.             return NOERR ;
  149.     }
  150.  
  151.     mix = mx ;
  152.     if( aSen )
  153.     {
  154.         mix = mix * b[3] / aMax ;
  155.     }
  156.  
  157.     c[0] = ( a[0] * mix + b[0] * ( 256 - mix ) + 0x80 ) >> 8 ;
  158.     c[1] = ( a[1] * mix + b[1] * ( 256 - mix ) + 0x80 ) >> 8 ;
  159.     c[2] = ( a[2] * mix + b[2] * ( 256 - mix ) + 0x80 ) >> 8 ;
  160.     c[3] = b[3] ;
  161.  
  162.     if( mix )
  163.     {
  164.         write( x, y, c ) ;
  165.     }
  166.  
  167.     return NOERR ;
  168. }
  169.  
  170.